#include <Arduino.h>
#include "DHT.h"
#include <U8g2lib.h>
#include <TM1637Display.h> // 添加数码管库

#define dht_pin 5
#define scl 14
#define sda 2
#define screen_rst 13
#define led_pin 4
#define key_function 12

// 定义数码管引脚（根据实际连接调整）
#define CLK 2
#define DIO 3

// 初始化数码管显示（四位数）
TM1637Display display(CLK, DIO);

// OLED 初始化
U8G2_SSD1306_128X64_NONAME_F_SW_I2C myu8g2(U8G2_R0, scl, sda, screen_rst);

DHT mydht(dht_pin, DHT11);

// 变量定义
int value = 0;

void setup() {
  Serial.begin(115200);
  myu8g2.begin();
  myu8g2.clearBuffer();
  myu8g2.setFont(u8g2_font_wqy14_t_gb2312);
  myu8g2.enableUTF8Print();

  mydht.begin();

  pinMode(led_pin, OUTPUT);
  pinMode(dht_pin, INPUT);

  pinMode(key_function, INPUT_PULLDOWN_16);

  // 初始化数码管
  display.setBrightness(0x0f);  // 亮度调节（0x00到0x0f）
  display.clear();

  // 初始LED状态
  digitalWrite(led_pin, HIGH);
}

void loop() {
  float hum = mydht.readHumidity();
  float temp = mydht.readTemperature();

  if (isnan(hum) || isnan(temp)) {
    Serial.println("DHT11 读取失败！");
    return;
  }

  // 显示温度在OLED
  static float last_temp = -99;
  static float last_hum = -99;
  if (abs(temp - last_temp) > 0.1 || abs(hum - last_hum) > 0.1) {
    myu8g2.clearBuffer();
    myu8g2.setCursor(2, 16);
    myu8g2.print("温度：");
    myu8g2.print(temp, 1);
    myu8g2.print("℃");
    myu8g2.setCursor(2, 32);
    myu8g2.print("湿度：");
    myu8g2.print(hum, 1);
    myu8g2.print("%");
    myu8g2.sendBuffer();
    last_temp = temp;
    last_hum = hum;
  }

  // 将温度转为显示数据（带一位小数，例如23.4°C -> 234）
  int tempDisplay = (int)(temp * 10); // 例如 23.4变成234

  // 判断温度是否在范围内（-99.9 ~ 99.9）
  if (temp >= -99.9 && temp <= 99.9) {
    uint8_t data[4];

    if (temp >= 0) {
      // 正数：显示两位数字 中间带小数点
      data[0] = display.encodeDigit((tempDisplay / 100) % 10); // 百位（0-9或者-1）
    } else {
      // 负数用负号显示（此示例未处理负号）
      // 你可以用特定编码显示负号，或直接显示0
      // 简化：负数显示0
      data[0] = display.encodeDigit(0);
    }

    data[1] = display.encodeDigit((tempDisplay / 10) % 10);   // 十位
    data[2] = display.encodeDigit(tempDisplay % 10);          // 个位
    data[3] = display.encodeDigit(11); // 点（对应小数点）

    display.setSegments(data);
  } else {
    // 超出范围，清空显示
    display.clear();
  }

  // 按钮控制示例：调节LED亮度（可根据需要调整逻辑）
  if (digitalRead(key_function) == LOW) {
    delay(50);
    if (digitalRead(key_function) == LOW) {
      value = (value + 1) % 16; // 亮度范围0-15
      display.setBrightness(value);
    }
  }

  // 控制LED
  if (value <= 10) {
    digitalWrite(led_pin, HIGH);
  } else {
    analogWrite(led_pin, (value - 10) * 25); // 转换为PWM值（0-255）
  }

  delay(200); // 控制刷新速度
}